<?
class usuarios{
	var $error;
	var $db;
	var $funciones;
	var $xajax;

	function __construct(&$db,&$funciones,&$xajax){
		$this->db = $db;
		$this->funciones = $funciones;
		$this->xajax = $xajax;
	}

/**************************************************
 * FUNCIONES DE USUARIOS FUNCIONES DE USUARIOS
 **************************************************/
	 /**
	  * Función que comprueba si un usuario puede conectar al sistema
	  * @param string usuario Nombre del usuario
	  * @param string contrasena Contraseña del usuario para acceder al sistema
	  * @param string vimg Cadena que contiene el valor de la imagen de verificación
	  */
	function conectar($usuario='',$contrasena='',$vimg=''){
		$usuario = $this->funciones->limpiarEntrada($usuario);
		$contrasena = $this->funciones->limpiarEntrada($contrasena);
		$vimg = $this->funciones->limpiarEntrada($vimg);
		//COMPROBAMOS IMAGEN DE VERIFICACION USUARIO Y CONTRASEÑA SEAN VALIDOS
		if($_SESSION['vimage'] != $vimg){
			$this->error = 'Imagen de verificaci&oacute;n err&oacute;nea ';
			return false;
		}
		if(!$this->usuarioValido($usuario)){
			$this->error = 'Nombre de usuario no v&aacute;lido';
			return false;
		}
		if(!$this->contrasenhaValida($contrasena)){
			$this->error = 'Contrase&ntilde;a no v&aacute;lida';
			return false;
		}

		if($usr = $this->db->get_one('usuarios',$usuario,'Usuario')){
			if($usr['Usuario'] == $usuario && md5($contrasena) == $usr['Contrasena']){
				$_SESSION['usuario'] = $usr['Usuario'];
				$this->db->update('usuarios',(int)$usr['Id'],array('Finger' => '_'));
				if($this->db->update('usuarios',(int)$usr['Id'],array('Finger' => $_SESSION['ss_fprint']))){
					unset($_SESSION['vimage']);
					return true;
				}
				else{
					unset($_SESSION['usuario']);
					$this->error = 'Error al intentar conectar al usuario al sistema';
					return false;
				}
			}
			else{
				$this->error = 'Usuario o contrase&ntilde;a no v&aacute;lidos';
				return false;
			}
		}
		else{
			$this->error = 'No se pudo obtener informaci&oacute;n del usuario';
			return false;
		}
	}//FIN conectar

	/**
	 * Función que comprueba si un usuario conectado es correcta la sesión que usa, para ello se almacena
	 * en la base de datos el campo Finger, este debe coincidir con el nombre de usuario registrado en la
	 * sesión. El campo Finger es generado por la clase securesession
	 * @return boolean Devuelve True si el usuario conectado es correcto o False en caso contrario
	 */
	function usuarioConectado(){
		$usr = $this->db->get_one('usuarios',$_SESSION['usuario'],'Usuario');
		if($usr['Usuario'] == $_SESSION['usuario'] && $usr['Finger'] == $_SESSION['ss_fprint']) return true;
		else return false;
	}//FIN usuarioConectado

	/**
	 * Función que desconecta un usuario de la web, destruyendo la sesión actual de conexión, así como el campo
	 * Finger de la base de datos lo vacía
	 */
	function usuarioDesconectar(){
		if($usr = $this->db->get_one('usuarios',$_SESSION['usuario'],'Usuario')){
			if($this->db->update('usuarios',(int)$usr['Id'],array('Finger' => '_'))){
				session_destroy();
				return false;
			}
		}
		else return false;
	}//FIN usuarioDesconectar

	/**
	 * Función que comprueba si un usuario es administrador o no
	 * @param string usuario Nombre del usuario a comprobar
	 * @return boolean True si es administrador, false en caso contrario
	 */
	function is_admin($usuario=''){
		$usuario = $this->funciones->array_limpiarEntrada($usuario);
		//SI $usuario está vacío entonces se toma como nombre de usuario el que está actualmente conectado
		if($usuario == '') $usuario = $_SESSION['usuario'];
		if($usr = $this->db->get_one('usuarios',$usuario,'Usuario'))
			return $usr['Admin'];
		else return false;
	}//FIN is_admin

	/**
	 * Comprueba que un nombre de usuario dado sea válido
	 * @param string nick Nombre de usuario a comprobar
	 * @return boolean True si es correcto, false en caso contrario
	 */
	function usuarioValido(&$nick=''){
		if(preg_match('/^[a-zA-Z0-9_]{4,16}$/',$nick)) return true;
		else return false;
	}//FIN usuarioValido

	/**
	 * Comprueba que una contraseña dada sea válida
	 * @param string contrasenha Contraseña a comprobar
	 * @return boolean True si es correcta, false en caso contrario
	 */
	function contrasenhaValida(&$contrasenha=''){
		if(preg_match('/^[a-zA-Z0-9]{5,16}$/',$contrasenha)) return true;
		else return false;
	}//FIN contrasenhaValida

	/**
	 * Comprueba que una dirección de correo electrónico es válida
	 * @param string email Dirección de correo electrónico a comprobar
	 * @return boolean True si es correcto, false en caso contrario
	 */
	function emailValido(&$email=''){
		if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email))
			return false;
		else return true;
	}//FIN emailValido

	/**
	 * Función que devuelve toda la información relativa a un usuario almacenada en la base de datos
	 * @param string usuario Nombre del usuario que se quiere comprobar
	 * @param int id Id del usuario que se quiere comprobar
	 * @return array Información relativa al usuario registrada en la base de datos
	 */
	function obtenerInfoUsuario($usuario='',$id=0){
		if($usuario == '') return $this->db->get_one('usuarios',(int)$id);
		else return $this->db->get_one('usuarios',$usuario,'Usuario');
	}//FIN obtenerInfoUsuario

	/**
	 * Función que modifica los datos relativos a un usuario
	 * @param array datos Matriz que contiene los nuevos datos del usuario
	 */
	function usuarioEditar($datos=array()){
		$datos = $this->funciones->array_limpiarEntrada($datos);
		//COMPROBAR QUE EL USUARIO EXISTE Y EXTRAEMOS SU INFORMACION
		if(!$this->db->exist('usuarios','Usuario',$datos['nombre'])){
			$this->error = 'No se encontr&oacute; al usuario';
			return false;
		}
		//COMPROBAR NOMBRE DE USUARIO
		if(!$this->usuarioValido($datos['nombre'])){
			$this->error = 'Nombre de usuario no v&aacute;lido';
			return false;
		}
		//COMPROBAR CONTRASEÑA
		if($datos['contrasenha'] != ''){//SI LA CONTRASEÑA NO ESTA VACIA ENTONCES HAY QUE MODIFICARLA
			if(!$this->contrasenhaValida($datos['contrasenha'])){
				$this->error = 'Contrase&ntilde;a no v&aacute;lida';
				return false;
			}
			if($datos['contrasenha'] != $datos['contrasenha2']){
				$this->error = 'Las contrase&ntilde;as son diferentes';
				return false;
			}
		}
		//COMPROBAR EMAIL
		if(!$this->emailValido($datos['email'])){
			$this->error = 'Correo electr&oacute;nico no v&aacute;lido';
			return false;
		}
		$usuario = $this->db->get_one('usuarios',$datos['id_usuario']);
		//ES ADMINISTRADOR
		if($datos['contrasenha'] != '')
			return $this->db->update('usuarios',(int)$usuario['Id'],array('Contrasena' => md5($datos['contrasenha']),'Email' => $datos['email'],'Admin' => $datos['admin']));
		else
			return $this->db->update('usuarios',(int)$usuario['Id'],array('Email' => $datos['email'],'Admin' => $datos['admin']));
	}//FIN usuarioEditar

	/**
	 * Función que registra un usuario en la base de datos
	 * @param array datos Matriz que contiene la información relativa al nuevo usuario
	 * @return int Devuelve 0 si el usuario no se pudo registrar, y la Id del nuevo usuario en la base de datos si todo fue correcto
	 */
	function usuarioAnadir($datos=array(),$admin=false){
		$datos = $this->funciones->array_limpiarEntrada($datos);
		//COMPROBAR IMAGEN DE VERIFICACION
		if($admin == false && $_SESSION['vimage'] != $datos['vimg']){
			$this->error = 'Imagen de verificaci&oacute;n err&oacute;nea';
			return false;
		}
		//COMPROBAR QUE EL USUARIO NO EXISTE
		if($this->db->exist('usuarios','Usuario',$datos['nombre'])){
			$this->error = 'Nombre de usuario ya registrado, por favor elija otro';
			return false;
		}
		//COMPROBAR NOMBRE DE USUARIO
		if(!$this->usuarioValido($datos['nombre'])){
			$this->error = 'Nombre de usuario no v&aacute;lido';
			return false;
		}
		//COMPROBAR CONTRASEÑA
		if(!$this->contrasenhaValida($datos['contrasenha'])){
			$this->error = 'Contrase&ntilde;a no v&aacute;lida';
			return false;
		}
		if($datos['contrasenha'] != $datos['contrasenha2']){
			$this->error = 'Las contrase&ntilde;as son diferentes';
			return false;
		}
		//COMPROBAR EMAIL
		if(!$this->emailValido($datos['email'])){
			$this->error = 'Correo electr&oacute;nico no v&aacute;lido';
			return false;
		}
		//COMPROBAR QUE EL EMAIL NO ESTA REGISTRADO
		if($this->db->exist('usuarios','Email',$datos['email'])){
			$this->error = 'Correo electr&oacute;nico registrado, por favor elija otro';
			return false;
		}
		if($admin == false) $datos['admin'] = false;

		return $this->db->insert('usuarios',array('Usuario' => $datos['nombre'],'Contrasena' => md5($datos['contrasenha']),'Email' => $datos['email'],'Admin' => $datos['admin']));
	}//FIN usuarioAnadir

	/**
	 * Función que devuelve una matriz con la información relativa a todos los usuarios registrados
	 * @return array Matriz conteniendo toda la información relativa a los usuarios de la web
	 */
	function usuariosObtenerTodos(){
		return $this->db->get_all('usuarios','Usuario');
	}//FIN usuariosObtenerTodos

	/**
	 * Función que devuelve únicamente el nombre de usuario y su id en una matriz
	 * @return array Matriz que contiene el nombre de usuario y el id del usuario
	 */
	 function usuariosObtenerTodosArray(){
	 	$tmp = $this->db->get_all('usuarios','Usuario','','ASC');
	 	$retorno = array();
	 	foreach($tmp as $key => $value)
	 		$retorno[$key] = $value['Usuario'];
	 	return $retorno;
	 }

	/**
	 * Función que elimina un usuario de la base de datos
	 * @param int id Id del usuario a eliminar
	 * @return boolean True si todo fue correcto, false en caso contrario
	 */
	function usuarioBorrar($id=0){
		return $this->db->del('usuarios',(int)$id);
	}//FIN usuarioBorrar

	/**
	 * Función que modifica los datos de un usuario
	 * @param array datos Datos relativos al usuario que hay que modificar
	 * @return boolean True si todo fue correcto, false en caso contrario
	 */
	function usuarioSuCuenta($datos=array()){
		$datos = $this->funciones->array_limpiarEntrada($datos);
		$usr = $this->db->get_one('usuarios',$_SESSION['usuario'],'Usuario');
		//COMPROBAR CONTRASEÑA
		if($datos['contrasenha'] != ''){//SI LA CONTRASEÑA NO ESTA VACIA ENTONCES HAY QUE MODIFICARLA
			if(!$this->contrasenhaValida($datos['contrasenha'])){
				$this->error = 'Contrase&ntilde;a no v&aacute;lida';
				return false;
			}
			if($datos['contrasenha'] != $datos['contrasenha2']){
				$this->error = 'Las contrase&ntilde;as son diferentes';
				return false;
			}
		}
		//COMPROBAR EMAIL
		if(!$this->emailValido($datos['email'])){
			$this->error = 'Correo electr&oacute;nico no v&aacute;lido';
			return false;
		}
		//EMAIL NO ESTE REGISTRADO
		if($this->db->exist('usuarios','Email',$datos['email'],$usr['Id'])){
			$this->error = 'Correo electr&oacute;nico ya registrado, por favor elija otro';
			return false;
		}

		if($datos['contrasenha'] != '')
			return $this->db->update('usuarios',(int)$usr['Id'],array('Contrasena' => md5($datos['contrasenha']),'Email' => $datos['email']));
		else
			return $this->db->update('usuarios',(int)$usr['Id'],array('Email' => $datos['email']));
	}//FIN usuarioSuCuenta

/**************************************************
 * XAJAX XAJAX XAJAX XAJAX XAJAX XAJAX XAJAX XAJAX XAJAX
 **************************************************/

	/**
	 * Función que mediante el uso de Ajax registra un usuario en la base de datos
	 * @param array datos Matriz que contiene los datos del nuevo usuario
	 */
	function xajax_anadirUsuario($datos=array()){
		$objResponse = new xajaxResponse();
		$datos = $this->funciones->array_utf8_decode($datos);
		if($id = $this->usuarioAnadir($datos)){
			$objResponse->addAlert(utf8_encode(html_entity_decode('Usuario registrado correctamente')));
			$objResponse->addRedirect('conectar.html');
		}
		else $objResponse->addAlert(utf8_encode(html_entity_decode("Error al realizar el registro: \n $this->error")));
		return $objResponse;
	}//FIN xajax_anadirUsuario

	/**
	 * Función que mediante el uso de Ajax registra un usuario en la base de datos
	 * @param array datos Matriz que contiene los datos del nuevo usuario
	 */
	function xajax_anadirUsuarioAdmin($datos=array()){
		$objResponse = new xajaxResponse();
		$datos = $this->funciones->array_utf8_decode($datos);
		if((int)$datos['id_usuario'] != 0){
			if($id = $this->usuarioEditar($datos)){
				$objResponse->addAlert(utf8_encode(html_entity_decode('Usuario modificado correctamente')));
				$objResponse->addClear('id_usuario','value');
				$objResponse->addScript(utf8_encode('xajax.$("f_usuarios").reset(); $("#s_usuario").selectOptions("'.$id.'");'));
			}
			else $objResponse->addAlert(utf8_encode(html_entity_decode("Error al realizar modificaci&oacute;n de datos: \n $this->error")));
		}
		else{
			if($id = $this->usuarioAnadir($datos,true)){
				$objResponse->addAlert(utf8_encode(html_entity_decode('Usuario registrado correctamente')));
				$objResponse->addClear('id_usuario','value');
				$objResponse->addScript(utf8_encode('xajax.$("f_usuarios").reset(); $("#s_usuario").addOption("'.$id.'","'.$datos['nombre'].'"); $("#s_usuario").sortOptions(); $("#s_usuario").selectOptions("'.$id.'");'));
			}
			else $objResponse->addAlert(utf8_encode(html_entity_decode("Error al realizar el registro: \n $this->error")));
		}
		return $objResponse;
	}//FIN xajax_anadirUsuario


	/**
	 * Función que verifica si un usuario puede conectar, si es así entonces realiza las acciones necesarias
	 * @param array datos Matriz que contiene los datos de conexión del usuario
	 */
	function xajax_conectarUsuario($datos=array()){
		$objResponse = new xajaxResponse();
		$datos = $this->funciones->array_utf8_decode($datos);
		if($this->conectar($datos['usuario'],$datos['contrasenha'],$datos['vimg']))
			$objResponse->addRedirect('admin.html');
		else $objResponse->addAlert(utf8_encode(html_entity_decode("Error: \n $this->error")));
		return $objResponse;
	}//FIN xajax_conectarUsuario

	/**
	 * Función que modifica los datos de un usuario
	 * @param array datos Matriz que contiene los nuevos datos del usuario
	 */
	function xajax_usuarioSuCuenta($datos=array()){
		$objResponse = new xajaxResponse();
		$datos = $this->funciones->array_utf8_decode($datos);
		if($this->usuarioSuCuenta($datos))
			$objResponse->addAlert(utf8_encode(html_entity_decode('Perfil actualizado correctamente')));
		else $objResponse->addAlert(utf8_encode(html_entity_decode("Error al actualizar su perfil \n $this->error")));
		return $objResponse;
	}//FIN xajax_usuarioSuCuenta

	/**
	 * Función que devuelve la información relativa a un usuario
	 * @param int id Id del usuario que hay que extraer
	 */
	function xajax_obtenerUsuario($id=0){
		$objResponse = new xajaxResponse();
		if($usr = $this->obtenerInfoUsuario('',$id)){
			$usr = $this->funciones->array_utf8_encode($usr);
			$objResponse->addAssign('nombre','value',$usr['Usuario']);
			$objResponse->addAssign('email','value',$usr['Email']);
			$objResponse->addAssign('id_usuario','value',$usr['Id']);
			$objResponse->addScript('$("#admin").selectOptions("'.$usr['Admin'].'")');
		}
		else $objResponse->addAlert(utf8_encode(html_entity_decode("Error: No se pudo obtener la informaci&oacute;n del usuario \n $this->error")));
		return $objResponse;
	}//FIN xajax_obtenerUsuario


	function xajax_borrarUsuario($id=0){
		$objResponse = new xajaxResponse();
		if($this->usuarioBorrar($id)){
			$objResponse->addAlert('Usuario borrado satisfactoriamente');
			$objResponse->addScript("$('#s_usuario').removeOption('$id');");
		}
		else $objResponse->addAlert(utf8_encode(html_entity_decode("Error: No se pudo borrar el usuario \n $this->error")));
		return $objResponse;
	}

	function registerFunctionsAd(){
		$this->xajax->registerFunction(array('usuarioAnhadirAdmin',&$this,'xajax_anadirUsuarioAdmin'));
		$this->xajax->registerFunction(array('usuarioObtenerInfo',&$this,'xajax_obtenerUsuario'));
		$this->xajax->registerFunction(array('usuarioBorrar',&$this,'xajax_borrarUsuario'));
	}//FIN registerFunctionsAd

	function registerFunctions(){
		$this->xajax->registerFunction(array('usuarioConectar',&$this,'xajax_conectarUsuario'));
		$this->xajax->registerFunction(array('usuarioSuCuenta',&$this,'xajax_usuarioSuCuenta'));
		$this->xajax->registerFunction(array('usuarioRegistrar',&$this,'xajax_anadirUsuario'));
	}//FIN registerFunctions
}
?>